/**
 * 判断线段是否相交
 * 参考 https://www.cnblogs.com/fangsmile/articles/8881139.html
 * @param a - 线段 1 一端坐标
 * @param b - 线段 1 另一端坐标
 * @param c - 线段 2 一端坐标
 * @param d - 线段 2 另一端坐标
 * @returns {boolean}
 */
export function isSegmentsIntersect(a, b, c, d) {
  // 三角形abc 面积的2倍
  const area_abc = (a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x)

  // 三角形abd 面积的2倍
  const area_abd = (a.x - d.x) * (b.y - d.y) - (a.y - d.y) * (b.x - d.x)

  // 面积符号相同则两点在线段同侧,不相交 (对点在线段上的情况,本例当作不相交处理);
  if (area_abc * area_abd >= 0) {
    return false
  }

  // 三角形cda 面积的2倍
  const area_cda = (c.x - a.x) * (d.y - a.y) - (c.y - a.y) * (d.x - a.x)
  // 三角形cdb 面积的2倍
  // 注意: 这里有一个小优化.不需要再用公式计算面积,而是通过已知的三个面积加减得出.
  const area_cdb = area_cda + area_abc - area_abd
  if (area_cda * area_cdb >= 0) {
    return false
  }

  return true
}
